// https://leetcode.cn/problems/add-strings/

/*
给定两个字符串形式的非负整数 num1 和num2 ，计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库（比如 BigInteger）， 也不能直接将输入的字符串转换为整数形式。
*/

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

class Solution {
public:
	// 尽量不要用 to_string方法
    string addStrings(string num1, string num2) {
		int len1 = num1.size();
		int len2 = num2.size();
		int flag = 0;
		string sum;
		int maxLen = max(len1, len2);
        sum.reserve(maxLen + 1);
		for(int i = 0; i < maxLen; i++){
			int tmp = 0;
			if(i < len1){
				tmp += num1[len1 - 1 - i] - '0';
			}
			
			if(i < len2){
				tmp += num2[len2 - 1- i] - '0';
			}
			tmp += flag;
			if(tmp >= 10){
				flag = 1;
				tmp = tmp - 10;
			}else{
                flag = 0;
            }
			sum += tmp + '0';
		}
		if(flag){
            sum += '1';
		}
        reverse(sum.begin(), sum.end());
		return sum;
    }
	
	// 简化代码
	string addStrings1(string num1, string num2) {
		int len1 = num1.size();
		int len2 = num2.size();
		int flag = 0;
		int maxLen = max(len1, len2);
		string sum;
		sum.reserve(maxLen + 1);
		int i = len1 - 1;
		int j = len2 - 1;
		while(i >= 0 || j >= 0 || flag > 0){
			int x = i >= 0 ? num1[i--] - '0' : 0;
			int y = j >= 0 ? num2[j--] - '0' : 0;
			
			int tmp = x + y + flag;
			if(tmp >= 10){
				flag = 1;
				tmp = tmp - 10;
			}else{
                flag = 0;
            }
			sum += (tmp + '0');
		}
        reverse(sum.begin(), sum.end());
		return sum;
    }
};

int main(){
	Solution so;
	string s1 = "11";
	string s2 = "123";
	string s3 = so.addStrings1(s1, s2);
	cout << s3 << endl;
	return 0;
}